package com.study.limit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * 通过zset实现简单限流
 * 这种方式只适合小数据量的限流，大数据量通过此种方式限流会浪费大量空间
 * @Author ytj
 * @Date 2021/11/14 21:57
 */
@Component
public class LimitByZset {
    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * @param name 用户名
     * @param reply 操作
     * @param time 时间内
     * @param maxCount 最大次数
     * */
    public boolean limit(String name,String reply,int time,int maxCount){
        String key=String.format("hist:%s:%s",name,reply);
        Long nowTime=System.currentTimeMillis();
        Long times=nowTime - (time*1000);
        this.redisTemplate.opsForZSet().removeRangeByScore(key,0,times);
        int count=this.redisTemplate.opsForZSet().size(key).intValue();
        if(count<maxCount){
            this.redisTemplate.opsForZSet().add(key,nowTime+"",nowTime);
            return true;
        }
        return false;
    }

    public void limit(){

    }
}
